You're not missing something simple but something quite complex. There are a number of ways:
#1. Use GtkTreeView. It has the scrollable window/ unscrolled header combination by default. Never used it myself - I'm rating this one as complex because TreeView is quite a bit to learn because of its very generic nature and that they don't make it especially easy.
#2. Have a table in a scrolled window and the headers in a box and link them in your code so that the one will update the other. Sub-optimal really.
#3. Create a custom widget to do exactly what you want. Essentially the same as #2, except that the link between the two is handled internally by the widget rather than externally.
Despite having a strong aversion to learning treeview I would lean towards it unless there was also other fancy features to add in. Getting it to look the way you want might take a fair bit of work. I think it's possible but don't really have experience on this. There seems to be plenty of tutorials around on treeview and if you search the forum you should find a few examples too (e.g. a slightly old post but one I imagine similar to what you are doing is
http://www.gtkforums.com/viewtopic.php?t=3362)
btw if you are moving to gtk3 you will want to use grid instead of table and box. Also ATK doesn't work with custom widgets in gtk3<3.8 whereas it's built in to treeview.