There are some major differences between how DX9 and DX10 utilizes the graphics card to present the user with an image.
Prior to DX10, visuals were restricted because of limitations due to utilizing fixed function pipelines. The older cards possessed different processors for each major function. There was a processor for shaders, a different one for the geometry, and yet another one to deal with the pixels. So, if you were in an area with a lot of geometry, the geometry processor would max out and nothing else could be worked on by the graphics card until the geometry was completed, underutilizing the full power of the card.
In DX10, the processors are all string processors, with each able to perform any task. If a scene required a lot of geometry, the card assigned as many processors as were needed, while at the same time assigning other processors to handle shading or shadows, allowing the video card to use 100% of its processor power.
Another problem pre-DX10 was with compatibility. Cards claiming to be DX9 compatible weren’t always compatible with all DX9 functions, as the cards only needed to cover certain core DX9 functions with the rest as optional. With DX10 any card that is DX10 compatible from the budget releases to the $500+ models, is capable of performing all DX10 tasks.
The last major difference with DX10 is in how it handles memory. DX10 enables virtualized memory, borrowing memory from RAM when the card’s onboard memory is filled.