I'm a programmer/developer also -- not a game developer (well not officially). I think you'll find that most developers are more than willing to work multi-threaded applications, but with that comes complexity and hence increased delivery time. Key being increased delivery time, this is where the project managers get involved and have to either find the funding and justification. OR, tell the developer not to implement -- and it is NOT a easy sell to fund these projects/games. Doing a well threaded game starts from ground up, it rarely is something you can just "add" or change your mind on midway thru the development process.
Threaded programming isn't "new" -- has been used and abused for a long time now. It's only come to light because of the limitations of the hardware -- the Ghz wall was hit earlier than expected by CPU manufacturers (or at least the ability to realistically regulate the heat & power consumption which as you pointed out is the real wall). So now we have multi-core chips cause CPU manufacturers haven't been able to work around this wall (yet). I still think the Ghz/heat wall will be solved, but til them the only marketable path is going with multiple cores -- at least it is giving time for chipsets and memory and motherboard designs to "catch up".
The developer CAN select a specific core to execute their thread (or threads). A common example of this is Prime95 testing program used by overclockers to estabilish the stability of the overclock across multiple cores -- Prime95 has specific core assignments (if it didn't, you wouldn't have any real test). When instantiating a thread the developer can either let the OS allocate as needed, or the developer can specifically allocate to a known core (as the number of cores will be known thru basic hardware discovery routines).
The OS and Development tools are the primary areas that have been lacking in good support for multi-thread CPU specific code. Mostly on the debugging side using Microsoft's Visual Studio platform. Think about it, if you have 4 threads running at the same time and you need to stop one thread to step thru the code line by line to see where a problem might be in that one thread path -- those 3 other threads keep running and are not entirely independant of the thread your currently suspending. There are tricks and solutions around this, but as you can see the process becomes considerably more complicated and time consuming especially when dealing with a "simulated" environment. I've done some threading on business level applications to provide a more responsive application, but threading multi-core business applications are almost trivial when compared to the complexity of 3D gaming applications trying to simulate an experience.
So what I'm trying to suggest, is that the developer tools provided by Microsoft are the current weakest links for gaming. Of course my assumption is that game houses use Microsoft's tools for the core, which may not be the case. But good multi-core code happens in the engine -- ironically John Carmack was one of the 1st to implement this in Quake -- a then OpenGL title.
My 2 cents, Rob.