Ok, your layout is declared a bit wrong. Firstly you are referencing a block with name
nav but you are also trying to declare this block inside
nav by referencing it. Layout names must be unique over the whole page, so you are effectively trying to declare a block inside itself.
Also you have declared a block of type
core/text_list. The job of this block is purely to render out child blocks added to it, so think of it as a container for other blocks rather than a block which will have it's own content render. If you look at core layout files, you will never see a template defined for blocks of type
core/text_list, you will just see these blocks referenced and child blocks added.
If you don't want to have child blocks of your block just change the type to either
page/html if it's the frontend, and add it to
root as the parent (as you are calling
getChildHtml() inside the root template):
<block type="page/html" name="nav" template="nav.phtml" parent="root" />
If you want to have child blocks automatically render out then you need to add children to the
core/text_list block you declare.
<block type="core/text_list" name="nav_parent">
<block type="page/html" name="nav" template="nav.phtml" />
You would then use a call to
<?php echo $this->getChildHtml('nav_parent') ?> in your root template which would render out the child block
nav (and any other child blocks of
nav_parent you added).