That's another totally weird thing about the client.. How can it possibly use a block as a head? Makes me wonder if the regular helmets are actually also place-able blocks :/ Or it's just a silly easter egg they put in. Either way the client is still weird.
You should try doing this with entity blocks, such as chests or the enchantment table thing

Hahahah that inventory should be exported to plugins without much checks to make use of this 'feature'. I would use that as some kind of punishment or reward

The server's inventory should be fully exposed to plugins, you can set anything as slot #5 (helmet slot) and it should be used by the client. You might want to test rigorously, though, if it doesn't make the clients crash or some other unexpected behavior.
Or you can simply edit the player JSON file if you just want to experiment.
you can put any block on your head and Minecraft doesn't crash. if you look at the /hat command in bukkit's essentials plugin you see that it doesn't crash

Well, that's troublesome. I have rewritten most of the windowing code and now the client crashes when I try to open a chest window. No idea why

I'm investigating with the ProtoProxy, but that means implementing a whole lot of new packet parsing in it.
Ah, found the culprit. As it turns out, I've forgotten to send correct window ID in the PACKET_INVENTORY_WHOLE packet, sending always ID 0; so when a chest was opened, MCS tried to push 63 slots into the player's inventory, rather than the chest window itself
Now chests work, but stopping the server after opening a chest makes the server crash

Oh god why can't it just work?

I've got inventory, crafting grid and chest windows working. I'm gonna finish furnace windows and then commit the changes.
Rev 870 broke even vc2008 builds, sorry for that, should be fixed in rev 872.
I tested r872 with two other players.
First I was unable to see one of the two players, but after teleporting to them they popped up. I do not see either of them move, I do see their hands move when they dig/place blocks.
I have been repeatedly kicked due to (after placing some water, don't know if it is related):
Unknown packet ID: 2 (and one time 122) I think this was on the client's side
Received a too long string
End of stream
I can't seem to replicate that.
What client version were all the players using? If 1.3.1 / 1.3.2, could you run through ProtoProxy and attach its log?