You can use C# for your webpart feature. Make an empty project, then add a webpart (non visual webpart) to the project. Use the C# object model to query the SPList object, then do a foreach loop to spit out the values into your nav bar.
The pain with C# comes when you have to update your feature with a different version number for the solution. That is unless you are excellent with the feature upgrade process. The pervious version webpart instance is stuck in WP zones of whatever ASPX they are stored in. I keep my solutions at version 1.0, then note a version number of the build in the feature description, which shows up in the features list in Site Settings.
You can use JavaScript for your web part feature. Make an empty project, then add a webpart (non visual webpart) to the project. Call the web service for getitems on the specific nav list. Visual studio will create a strongly named class for the SP site that the list lives in, that stores the definition of all the lists in that site. If your nav list changes, refresh the web serivce and update this strongly named class.
When your web part runs, the web service will run as the user that is logged in. So either make sure all visitors have view rights, or make a AD service account to call the web service. Once your Javascript returns the XML, use a parcer like Lync to XML to get the data and spit out the HTML into the nav bar.
It's more about comfortable preference than which is better. If you're using SharePoint 2013, make a SP app instead of a farm feature. Then you can only use JavaScript and web services.