I think that this is actually the result of using a very typical, accepted, and normal technique for developing software that typically runs with minimal user multi-tasking. If you're familiar with the terms, GC2 is polling the message queue, not blocking on it.
Specifically:
When using a program like Microsoft Word or Notepad, the program is very frequently not doing anything. It has nothing to do while waiting for you to hit the next key, for example. Because there's almost never anything for this sort of program to do that's computationally expensive, the program actually does just not
do anything. This is executed, at the most fundamental level, with code like the following:
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
What's this do? It executes the function "GetMessage()" and, when GetMessage() returns with a value that's greater than zero, it translates and dispatches the message. The key here is that GetMessage does
not return right away! Rather it sits there, and sits there, and sits there. It may sit there for milliseconds, it may sit there for days. If the program has no incoming message, the program will never ever do anything because it'll sit there waiting inside GetMessage(). With a GetMessage(), the program
only runs when it receives a message. If it doesn't receive a message,
it doesn't run! That's why your CPU isn't pinned. Whenever you're running a piece of non-trivial windows software, and it's just waiting for some sort of input, it's waiting inside GetMessage() or something similar. It's "Blocked."
Sadly, this doesn't work so well for real-time software or videogames such as GalCivII. GalCivII, even if you never touch the mouse, has to continue updating itself. It needs to run the AI in the background, update video, etcetcetc. And while many of us have the popular GPU, the CPU is still dispatching commands to it. This means that real-time software, like video games, will generally use a message pump like the following:
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
DoSomethingWhileWaitingForInput();
}
Do you see the difference? Instead of "GetMessage()" we used "PeekMessage()"! The difference between these two functions is that PeekMessage will
never sit there waiting! That is, PeekMessage does not "Block." Instead it will always return, whether a message was there or not!
That means this loop will always be running at full speed. This is a form of "polling," because the program is constantly "polling" the message queue to see if there's a new message.
This means that
our program will continue to run, and continue to update, even if it hasn't received a message, and that's a "Good Thing".
Have you ever had a shareware or free program that wouldn't update until you moved the mouse, even though you thought it should? That's because they used GetMessage and didn't post occasional update messages back to themselves.
GC2's video is very sensitive to timing (as evidenced by the funky bug with multi-core CPU's and graphical "jitter"), so it's not surprising to me at all that they'd want as much control over the timing as possible. And that's what polling with PeekMessage lets them do.
There are lots of resources on the web about this, I stole some of my examples from:
Beating the Message Pump
Documentation for GetMessage() and PeekMessage() can be found on MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/getmessage.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/peekmessage.asp
So don't worry, don't panic. (a) This isn't a windows bug. (

This isn't a Stardock bug. (c) This isn't any more non-green than any other modern, intensive game. Even Starcraft did this, e.g.
A case could be made for pausing the state of the game and kicking into an alternate message loop or some such craziness when alt-tabbing to save those cycles, but there are a lot of nasty technical issues and gotchas involved, and getting Alt-Tab to work properly in software like this can be tricky enough as it is.
I have, of course, glossed over a great many technical details, and I've said some things that are just plain wrong for the sake of illustrating underlying concepts. I encourage anyone who's interested to perform further research. Learning the fundamentals of message-based programming can be an intriguing topic if you like that sort of thing.
Good gaming, all!
(Oh! And Stardock! If I ever get laid off, please hire me!

I'm not that far away: I went to school in Toledo and am working in Cleveland on process control software right now. )