I would work my way up-- start with a 2-tile creature. Think a snake.
Here's how I'd do it: two different creatures, head and tail. The tail doesn't do anything, maybe just passes damage it receives on to the head. When the head moves, the tail moves into the space previously occupied by the head. When the head and tail get drawn, rotate their appropriate textures so that the head and tail meet. (EDIT: or I suppose the easier way to do it is to use a single texture, rotated appropriately, but then you might have difficulty when you want to show how many arms your dragon has had chopped off
A three tile snake gets a little more complicated, because you need to specify what the 3rd segment does when the first segment moves onto the 2nd segment (if you want your creature to be able to do that!) Hardly an insurmountable problem, you just need to figure out how you want to handle it.
If you want your creature to be a 3x3 blob, but be able to make it through doors, then spawn its peripheral body on a turn-by-turn basis, only if the hex is free. This same technique can be used to create limbs, if that's what you'd prefer. Note that you'll have to despawn the peripheral body (or do something with it!) if you want to blob center to realize it can move, so you're basically looking at replacing creature AI with despawn periphery, AI, spawn periphery.
If you don't want your creature to be able to make it through doors, it gets more complicated, because you have to rewrite pathfinding code, but I would stay away from this anyways, because it makes your creatures very easy to game.
Obviously, the parts of a multi-tile critter need to communicate well. There are multiple ways to handle this. You could have separate effects, hp totals, etc for each component, with the head passing a "die now" message to the rest of the body when it dies (or not!); you could just keep track of hp and effects for the head, and apply them to all components; you could do any number of things, with the best answer depending on what exactly you were trying to make. (Think about the difference between making a zombie dragon like from Dark Souls and making the Midgard Serpent. They'd communicate with their components in very different ways.)
EDIT: Even if you want a large creature that can't make it through narrow openings, this is relatively easy from a programming standpoint. Simply have them pathfind through a modified map.
For instance, if you have a 3x3 creature, you take your input map, and extend each wall by one tile in every direction. Now you have a map that your 3x3 can path through. (You also have to make sure it doesn't try to path to things inside of walls, because it can't reach them-- when chasing the player, for instance, it should try to path to tiles that are within 2 tiles of the player, rather than just one tile.)
If you have something like a 2x2, nominate (say) the NW corner as the pathfinder. Now go through your map, first from the east and then from the south, and every time you run into a wall, put another wall behind that wall (to the east or to the south of it).
This can extend to creatures of any square dimension. Creatures with orientation (take up more space in one axis than another) wouldn't work for it. It's remarkably similar to how collision is handled in my first love, Quake-- the players and monsters are point entities, and the walls are invisibly extended by half the size of the appropriate creature's bounding box.