Oh the irony of using Java syntax
I'm not sure of the technical detail here (I'm sure somebody will correct me if required). Android software is written in Java syntax and compiled down to something that the Dalvik VM can run. Tru java is late binding, so with some defensive coding it would be relatively trivial to abstract out the Android 2.1 API usage into separate classes. This would allow developers to write 95% of their code to run on any Android platform, and then to only offer the extra 5% of functionality if the handset reported Android 2.1.
You could use this approach for all phone-specific and android version-specific functionality, allowing a 'lowest common denominator' application to be written that simply was more functional on some handsets / versions of Android.
That there are so many headaches with applications across the different Android phones implies that this cannot easily be done. No late binding. But of course, if Google had adopted Java wholesale - VM and all - this would not be a problem. Google's desire to control has well and truly backfired on it here.