Rivers and fortifications don't live in hexes. Rather, they live on the edges of hexes, and their effects are felt when you try to cross them. Forts and rivers are always visible.
Rivers are portrayed on the map as a blue line that runs along a hex edge. Crossing an unbridged river costs 2 moves. Units with less than 2 moves cannot cross rivers. However, rivers can be bridged by building a road on both sides of the river. Moving from road to road across the river is considered moving across a bridge, and counts as normal road movement (ie: 1/2 movement or free for tanks). A road on only one side of the river doesn't help cross the river - trying to move across from this road still costs 2 moves.
You can, of course, scorch bridges to deny them to the enemy and check his advance.
Maybe I will also introduce a weather effect so that rivers "freeze" in cold weather and can be crossed for lower cost... although, that's hardly an advantage in most winter weather, which reduces movement on its own.
There is no penalty for attacking across a river (as yet).
Fortifications, on the other hand, impose a penalty for attacking but no movement penalty. Attacking across a defensive line halves the damage the attacker deals. The defender still deals full damage. Forts work both ways, regardless of who built them.
Non-elite units behind a defensive line (fortifications) will only retreat if attacked by a unit more than twice as strong as themselves.
Assault pioneers ignore the effects of fortifications, as do artillery. You can build defensive lines for $10 for 3 hex edges ($5 seemed too expensive and $5 for 2 too cheap, so this is what I came up with). Engineers can also build them in the field free of cost, but only one hex edge at a time.
To help illustrate the points, I made this graphic, after which I'll discuss the Defensive Mentality debuff.