So with some trickery here's how I managed to get it working, you'll need: Stash, GWcode Categories & Switchee
URLS conform to either of these:
mysite.com/products/category/list-entires
mysite.com/products/category/sub-category/list-entries
{!-- Create list of top level categories WITHOUT children --}
{exp:stash:set name="flag_categories_1" save="yes" replace="no" parse_tags="yes"}{exp:gwcode_categories channel="flags" style="linear" show_empty="yes" depth="1" last_only="yes" backspace="1"}{cat_url_title}|{/exp:gwcode_categories}{/exp:stash:set}
{!-- Create list of top level categories WITH CHILDREN --}
{exp:stash:set name="flag_categories_2" save="yes" replace="no" parse_tags="yes"}{exp:gwcode_categories channel="flags" style="linear" show_empty="yes" depth="2" backspace="1"}{cat_url_title}|{/exp:gwcode_categories}{/exp:stash:set}
{!-- Crete list of Sub categories --}
{exp:stash:set name="has_child" save="yes" replace="no" parse_tags="yes" parse_condtionals="yes" trim="yes"}{exp:gwcode_categories channel="flags" depth="2" style="linear" backspace="1" show_empty="yes"}{parent_url_title}|{/exp:gwcode_categories}{/exp:stash:set}
All that above does is record stashes for Categories with No children, Categories with Children and a list of child categories.
Then we test segments, starting with the outermost (segment_3).
{exp:switchee variable="{segment_3}" parse="inward"}
{!-- Seg 3 is a child category - Show list of entries--}
{case value="{stash:flag_categories_2}"}
…
{/case}
{!--Seg3 not valid, Seg2 - not valid. Show root categories--}
{case default="yes"}
{switchee variable="{segment_2}" parse="inward"}
{case value=""}
…
{/case}
{!-- Seg2 Category Has children, show child categories--}
{case value="{stash:has_child}"}
…
{/case}
{!-- Seg2 - valid category with NO children, show list of entries --}
{case value="{stash:flag_categories_2}" default="yes"}
…
{/case}
{/switchee}
{/case}
{/exp:switchee}
Hopefully this may help others trying to figure out something similar. Or chime in with your preferred method.