That said, I've read a few hexcrawl modules, and I find them a bit hit or miss. In a lot of ways actually, but here I'll talk about the individual hex descriptions. Like, here's the third keyed location from Carcosa:
Village of 270 Black Men ruled by “the Overking of All the Lands,” a chaotic 7th-level Fighter.
Okay...the title is kinda cool, but that doesn't give a referee much to turn into an adventure. Unfortunately, a lot of Carcosa is like that.
I'm about to share a few tips for writing better hexmaps, but first I want to explain exactly what they're for.
Hex locations come in two varieties: short descriptions, and fully detailed. Most are the former; a fully detailed location would have like a full dungeon map, or village with named NPCs, and generally be a few pages long.
Short description locations vary in how short they are, mostly based on how big the hexmap is. Big maps lie Carcosa or The Colossal Wastes of Zhaar tend to have super short ones; smaller, denser maps like Hot Springs Island or Fever Swamp usually have longer "short" descriptions, maybe a few paragraphs.
What I'm writing about here mainly pertains to stuff like Carcosa, where you want to jazz up your hex locations– and have a system for generating good hex locations fairly quickly– but also need to keep them fairly short. I used a similar method to create this 7-hex adventure, and this one.
Add 1-2 Internal Characteristics of the Location
That is, things that are purely self-contained and don't pertain to its relationship with other locations. For instance, that location from Carcosa could be expanded to:
Village of 270 Black Men, ruled by “the Overking of All the Lands,” a chaotic 7th-level Fighter. Currently suffering a mild famine due to crop failures.
That's not much, but it gives a referee at lest some direction for how to make the village interesting. Food will be extremely expensive. The villagers may be desperate enough to resort to brigandry, or at least traveling a longer than usual way to hunt and forage in dangerous areas. They might buy food at very high prices.
The bar doesn't have to be set very high most of the time. Some villages could be haunted, but you can and should have a lot of fairly normal stuff like crop failures going on too. This brings the world alive, and gives a referee more to go off of, without packing the hex map full of excessive weirdness.
Add a Relationship to Another Hex Location
Every hex map does this with some locations. I'm saying you should do it with every location.
Again, the bar doesn't have to be set very high though. A lot of the relationships can be like "Village A trades wheat and wool for lumber and tools from vilage B," or "The bandits in hex C7 occasionally raid this village." That's enough to give you potential plot hooks.
The above description could now be expanded to:
Village of 270 Black Men, ruled by “the Overking of All the Lands,” a chaotic 7th-level Fighter. Currently suffering a mild famine due to crop failures. Several people in this village are secretly space aliens in disguise, here to monitor and sabotage attempts to explore the ruins in hex 0101.
Again, not much, and it doesn't take up much more space, but you can already see a few ways these could lead to adventures.
I recommend creating one such relationship for every keyed hex location. Since relationships are two-sided, this means every hex location will have at least one relationship, but the average hex content will have two.
Just like the hex contents themselves, these relationships don't have to be used. They're there if you need them, but your party can just as easily interact with a hex location in ways that never bring the relationship into play.
One other advantage they have is that they give the party a way to discover each hex location. This can be useful when generating hexmaps on the fly.
Generating the Hex Map As You Go
Creating a big hex map all at once would be a lot of work and probably not very fun. Creating a little bit at a time is fun.
I recommend only keying up a small area when you start a campaign, like 6-10 hexes. After that the usual advice is to build the map out in whatever direction the party moves. I do believe in that, but the limitation to it is that you're only building out hexes after the players move into, or at least near them. That obviously doesn't answer the question of how the party would find out about new stuff, other than just wandering aimlessly.
This where relationships come in. You can build out hexes in the way described above– but then for every new location, add a relationship with a random keyed location in a random direction at a random distance.
Here's how you do it: after you create a new hex location, roll a d12 for a direction. For distance, roll d6-1 if it's an orthogonal direction, or d4-1 if it's a diagonal (since a diagonal is about 50% longer than an orthogonal). That's how many hexes away the other side of the relationship is. If you want to occasionally generate some long-distance relationships, make the distance dice explode.
e.g. I generate a village, then roll a d12 and get a 4, so it's southeast. I roll a d6 and get a 5, so it's five hexes away. I generate a troupe of traveling entertainers, so I decide the relationship is that a boy from the village ran off to join the entertainers, and his family wants him back. The troupe needs another relationship, but I'll just make a note to generate that only if and when the party heads that way.
If you're at a loss for what kind of relationship two things should have, you can make a reaction roll– 12 means they're allied, 7 means they're neutral, etc– and flesh it out from there. Add a positive or negative modifier based on how friendly they most likely should be, like a positive modifier for two villages and a negative for a village and some bandits.
By using these methods, you can quickly create a hex map packed fairly densely with interesting features that inter-relate to each other in complex ways and offer meaningful choices to the players about where to go and what adventure seeds to interact with.