Did you look at the MidiSynthesizer class? Use GetAvailableInstruments, which returns a list of MidiInstruments Then
For Each MI as MidiInstrument In Synth.GetAvailableInstruments
Log(MI.Name)
Next
Attached external instruments (Unless they are a synthesizer see answer to 3) will not return an instrument list using this method. It is possible that it may respond to a Sysex command to get a dump of the patches which you would then need to parse.
Why Not?
As I said before, you can't control an external instrument using a synth object, unless the MidiDevice is recognised as a Synthesizer. You can check it with MidiDevice.IsSynthesizer. This is only likely to work if the external instrument is connected via USB (Not a midi port adapter), even then there is no guarantee.