"Bed: Needs Bed" is a great example of where improvement can be made, and a fairly good test case to think about improvement options.
I am pretty strongly of the opinion that hiding options generates both less learning, and more confused questions. Graying out is a superior choice in almost all cases.
Given that, one observation I've noted in a couple of applications in the last year or so is that the added utility of the application having a pop-up or other presentation on long-hover of *why* something is grayed out is a really significant from a end-user standpoint. (Or, perhaps, "Press F1 to show reason this choice is not available"?) If the user in the above example was presented with "Cannot designate location to install bed because no unallocated and unforbidden beds are in site inventory", that would provide an immediate and substantial clue toward what to do to fix the problem. If, when then attempting to craft a bed, they were then presented with "Bed cannot be queued for crafting because no unallocated and unforbidden suitable materials are in site inventory (objects of type "bed" require available material of type "wood")", that would then lead fairly obviously to the next stage of the process, and so on.
The above level of more specific and resolution-focused error message shouldn't require too much additional program logic (tm), as one would presumably set up a structure such that the code check that sets the option grayed out also sets the "why" string or code to be handled by the interface later in whatever fashion(s).
A further advancement in user-friendliness would be proactive, resolution-focused warnings, possibly of more than one severity level. "Warning: You are attempting to designate a tree-chopping area, but no available dwarves have Wood Cutting enabled as a labor. Continue anyway? Y/N", perhaps. "Suggestion: You are attempting to designate a tree-chopping area, but while there are X dwarves with Wood Cutting enabled as a labor, none have an axe in their personal inventory, and there are no unallocated and unforbidden axes in site inventory. Continue anyway? Y/N" would be an even further refinement. This *would* require extra work at a few levels; while it would probably be worth it in the end, I'm not sure that's a sensible goal for a near-term release.
The overall intent of resolution-focused messages should be that, when seeing the detailed error, warning, etc. message, there should be an obvious, implied action that the user presented with the message can try to resolve it. If this is propagated through the whole interface, it will naturally lead users to discover the things they need only slightly after they need them, even on their first playthrough.
(I am old-school about Roguelikes enough that I am OK with users having to make a few mistakes to learn; but it should be obvious what went wrong and what direction to try something different on the next take. So, "I need to place beds to keep the dwarves from complaining about not sleeping in a bed; but I didn't bring any beds, or any wood, and I embarked on a barren mountainside with no trees, and I'm screwed." is an acceptable bad end, because you've done something that is not the normal default to start with, and have several immediately obvious options for trying again with better choices. Some people prefer learn-by-doing, and resolution-focused messages strongly help with that. Others prefer learn-by-research, and they will presumably encounter some sort of walkthrough or guide suggesting that wood is useful in the course of doing so; in case they've unknowingly failed or forgotten a step, the resolution-focused messages help them get back on track.)
Edit: To add a light-hearted example, consider the famous
Monty Python Cheese Shop Sketch as an example in (bad) user interface design.
Enter Shop > Talk to Shopkeeper > Buy Items > Buy Cheese
Select type of cheese to buy: [Red Leicester] > Red Leicester is not currently available.
Select type of cheese to buy: [Tilsit] > Tilsit is not currently available.
Select type of cheese to buy: [Caerphilly] > Caerphilly is not currently available.
...
Select type of cheese to buy: [Camembert] > Select type > Firm > Firm Camembert is not available
Select type of cheese to buy: [Camembert] > Select type > Runny > Runny Camembert is not available
...
ESC > Set Options > Shop music loop > Off
...
and so on.
If the response to "Buy Cheese" had been, say, "Buy Cheese: 0 units in 0 types currently available", the whole frustrating experience would have been short-circuited. Bad for a comedy sketch based on increasing frustration, perhaps; but far better when considered in light of the new user / "noob" experience.