Every version of Android generally uses a newer kernel release, but many Android drivers are binary-only and thus cannot be updated to work with newer kernels. To get ICS working on the G2, for example, hackers had to create a frankenkernel that could load old 2.6.x drivers but had the 3.x features that ICS needs. This is a lot of work and it has to be done for every SoC. Also, I get the impression that the custom ROM community is not well-organized.
Finally an actual simple explanation about where the source of the problem actually stems from! A similar thing happened to my ATI X1400 with newer X.Orgs (So when that motherboard died, I upgraded to Intel graphics).
Reading the oldnewthing MS money story the other day, I couldn't help but feeling that something was lost with the emphasis on source compatibility and programming to the abstraction. Clearly there's countless of benefits of doing such, but I'm starting to feel as if making ABIs more prominent wouldn't be the worst thing either.