I'll add to this discussion by pointing out that getting Android itself working on the newer devices has very little to do with simply "having the source code". Once the team had 1.6 working on the 2G/3G for example, they were able to very quickly use that work and get other versions of Android running as well. That's not the real issue here.
Android runs on a stripped down version of the linux kernel. Now, linux itself is extremely versatile, and will happily compile and run on as simple or as complex an environment as you can find. It basically only needs a CPU and memory to operate. Android, however, expects its linux kernel to be running on a very specific set of hardware, with published specifications. It expects to see certain devices with certain signatures and it expects to be able to interface with those devices in a very specific way. A lot of this is based on existing linux standards, but a great bit of it is complicated both by unusual Android specifications, and also by the non-standard hardware used in the iPhone.
The dev team here, in order to magically make even 1.6 work on newer devices, needs a few things. First, they need the ability to boot linux, which requires root access to the 3GS/i4, which was only recently obtained. Then, they need to figure out the hardware, which changed substantially since the version of the hardware they have working. That requires very challenging and difficult techniques, complicated by the relative lack of documentation. So, a lot of the developer's actual progress is going to result from "hacks," "workarounds," and "fixes" because they're sort of shooting in the dark as it is.
The first priority for every single device (and the project as a whole) is to emulate enough of the devices that Android expects to see, and that comes by writing device drivers that wrap the iPhone's hardware and expose it as the right kind of device. I believe linux itself does a lot of the legwork of communicating the devices to Android's processes, which helps, but there are still gotchas that crop up from time to time. This includes things like the camera and bluetooth, these are hardware devices that are not yet fully understood. Someone has to reverse engineer what iOS is doing to those devices, figure out the protocol, and write (and test!) a device driver before Android can use it, and this is not a simple task. Sometimes that's helped when we discover that the chipset is already used / already has drivers written that we can get to, but this is not always the case. (Think about the multitouch firmware that has to be ripped for example, because the chip that controls that device needs to have firmware uploaded to it before it can be run.)
I guess my point in all of this is to say that the developers are performing incredibly impressive and complex tasks and it doesn't benefit anyone to complain about their methodology. No one is paying them, they are getting no personal benefit out of this project other than being happy that it is done, and a little bit of internet fame in the process. I think it makes much more sense for the developers to work on the things they find most fun to work on, because that's why they're here, that's why the project even exists, and more of us need to realize that.
Sorry for the long rant.
Um, Merry/Happy Christmas?
-Zeta