Your hash of arrays idea seems like a perfectly sensible approach. Whether the structure is hard-coded or is somehow input-dependent, you can easily manage the BrowseEntry widgets:
...
# populate %hash as per the OP
# create $first_BrowseEntry, then:
$first_BrowseEntry->insert( "end", $_ ) for ( sort keys %hash );
...
sub first_browse_callback
{
$second_BrowseEntry->delete( 0, "end" );
my $chosen = $first_BrowseEntry->get;
$second_BrowseEntry->insert( "end", $_ ) for ( sort @{$hash{$chose
+n}} );
}
There'll be more code than that, of course, but not a lot more. When you create the first_BrowseEntry widget, you'll include the "first_browse_callback" function as the "-browsecmd" option value.
(updated to use consistent naming on the widget variable)