Well for one, that's not how colgroup works. However, prince also appears not to support the correct syntax, which is
<html>
<head/>
<body>
<table>
<thead>
<colgroup style="background-color:#dfd;"></colgroup>
<colgroup style="background-color:#ddf;"></colgroup>
</thead>
<tbody>
<tr><td>Ohai</td><td>Ohai</td></tr>
<tr><td>Ohai</td><td>Ohai</td></tr>
<tr><td>Ohai</td><td>Ohai</td></tr>
</tbody>
</table>
</body>
</html>
It's worth noting that the CSS specification also doesn't actually permit you to set text-align via col, because col is basically a dead element. You're only allowed to set border, background, width and visibility. Reference:
http://www.w3.org/TR/CSS2/tables.html#columns.
The desirable way to screw with columns in tables through CSS is to create a selector that addresses the Nth column directly. It looks more clumsy up front, but it's more straightforward, more powerful, more flexible and less to fight in the long run, and it works everywhere.
Here's a table where the first column is left-aligned, the second through fourth are centered, and the rightmost is justified. As long as you don't need jagged colspans, this approach is everything you need; just remember that the last one you set leftmost sticks until you say otherwise.
<html>
<head>
<style type="text/css">
table { border-collapse: collapse; border: 2px solid black; }
td { text-align: right; font-weight: bold; border: 1px solid gray; padding: 0.25em 0.5em; }
td+td { text-align: center; font-weight: normal; }
td+td+td+td+td { text-align: justify; }
</style>
</head>
<body>
<table>
<tr><td>Ohai lorem</td><td>Ohai ipsum</td><td>Ohai dolor</td><td>Ohai sit</td><td>Ohai amet</td></tr>
<tr><td>Ohai</td><td>Ohai</td><td>Ohai</td><td>Ohai</td><td>Ohai</td></tr>
<tr><td>Ohai</td><td>Ohai</td><td>Ohai</td><td>Ohai</td><td>Ohai</td></tr>
<tr><td>Ohai</td><td>Ohai</td><td>Ohai</td><td>Ohai</td><td>Ohai</td></tr>
</table>
</body>
</html>
John Haugeland is http://fullof.bs/