Most likely culprit of that is usually failing to test for unusual differences -- there were no less than 52 separate patches to IE6 alone, many of which changed it's behavior. As the trident engine is also used to render the UI, different versions of the OS can also have a great impact. Generally IE 5 and IE6 both behave differently under 2k and XP than they do 9x... Usually I've found if it works in 5.5 under 9x, you're good to go in 2K/newer with 6. Which is why I still test 5.5 and 6 under 9x instead of XP... XP I use for IE 7 and 8, with 9 installed native under Win7.
I don't make it "perfect" for them, but the page should at least still be usable. (even if the layout has some issues like some elements not centering).
Though my simple rules of "never delcare width or height on same elements as padding/border, don't trust the default line-heights, if you change font-size redeclare the line-height, put haslayout triggers on the parents of positioned elements" is why I can still write pages that work just fine on the latest bleeding edge while working just fine all the way back to IE 5.5 (and sometimes 5.01)
I mean, apart from once in a blue moon needing zoomfix... that's it. I almost wonder why people think supporting the older IE versions is "hard" -- then I see their code and go "oh..." Well, that and there's a lot of stuff I wouldn't do in a layout in the first place; typically the stuff that leaves the art major going "but I can do it in photoshop"