So, I've seen a whole bunch of posts railing against Direct3D 10 - specifically in regards with skepticism to the difference in visual quality between DirectX 9 and DirectX 10. So here's a bit of information from what little tidbits I've gathered here and there in my little Direct3D 10 experiments.
First of all, I believe John Carmack is completely correct when he believes that the potential in Direct3D 9 has yet to be maxed out. Also, I believe that the current belief amongst developers is that there is, at this point in time, very little Direct3D 10 can do that Direct3d 9 can not do. I fully believe that the kinds of DirectX 10-only features that you'll be seeing in games like Company of Heroes, World in Conflict, Crysis, Hellgate: London, and other games are completely do-able in Direct3D 9.
This all said, Direct3D 10 is an API that has been completely overhauled from its predecessor. As a developer, it is taking me a bit more time than I'd care to admit to adapt the syntactical differences present in the DirectX 10 SDK. The TL;DR version of the differences between the two APIs are as follows: DirectX 10 has, for all intents and purposes, completely ditches the fixed-function pipeline. In lay man's terms, this means that Shaders Are King. Instead of having a fairly strict graphic pipeline (think a "one size fits all" approach to graphics rendering), things are now completely programmable. A slightly inaccurate, though simplistic, look at things is that geometry first goes through a Vertex Shader (which performs operations on a per-vertex basis), then through a Geometry Shader (a DirectX 10/Shader Model 4.0 exclusive feature) which performs operations on a polygon/triangle level. Then, the data is rasterized to a pixel form where Pixel Shader performs its operations (things like bloom, depth of field, blurring are done here). After those major three steps, you see the result on your monitor. With Direct3D 10 (and, to a lesser and not guaranteed extent, Direct3D 9) the developer has complete control over what occurs during these steps, as opposed to it being dictated by the API.
Another couple important consideration is that, with D3D10, the graphics device is viewed as a shared system resource -- Direct3D does not have a monopoly over its use. The best example of this point is the Windows Vista Aero theme, which relies on DirectX for its rendering. When you launch a game, you may see the game disable the "pretty Aero" (because it has that capability) through the duration of its lifetime; when the game ends, the "pretty Aero" will pop back up, and this all occurs through the API. The game isn't doing anything dirty like modifying your OS settings or anything.
My personal favorite feature of Direct3D 10, though, is that there is a guaranteed set of functionality which the programmer can exploit so long as the end user's computer is capable of using D3D10. With previous versions of Direct3D, the programmer had to query various aspects of the graphics card through the D3DCAPS system. The CAPS system would tell the developer if, say, the graphics card supported dynamic textures, if it could create shareable resources, if it could automatically generate mipmaps, and so on. It was a pain in the ass. With D3D10, though, there's always that guaranteed layer of functionality.
So, basically, while the difference in visual quality difference between DirectX 9 and DirectX 10 may be near-nothing right now -- and I believe that the games which heavily market the differences in their 9/10 renderers is pure hypespeak -- the point to remember is that D3D10 is an overhauled API from DX9 for a reason. This reason is that it brings a far more powerful, safe, and guaranteed set of features to the developer for the developer to go nuts with.
Carmacks Quakecon 2007 Keynote: http://www.quakeunity.com/file=2513
For More: An Overview of Microsoft's Direct3D 10 API.