I think you need to clarify what you're talking about, as what you're asking is much less complicated than loading the assemblies in the first place.
After you're done with the assembly loading, you'll have a list of types that implement your interface. Simply iterate through, creating buttons for each and, in the click event handler for the button, run your showPrefs method.
Here's some c# pseudocode:
Button b;
foreach(var i in instancesThatHavePrefsMethods)
{
b = new Button();
b.Click += (o,e) => { i.showPrefs(); };
this.Children.Add(b);
}
Once I have the types, I can instantiate one of each, holding on to them. Then all I need to do is create a button for each, add an event handler (the enclosure created by the lambda in the pseudocode holds the reference to the correct instance; you can alternatively create your own class to do this or mandate an event handler in your interface), and then add the button to your form.
From your clarification, there are a couple different ways to do this.
First, mandate an event handler on your interface thusly:
public interface IPluginKLol
{
//snip
///<summary>An event handler, when fired, calls <seealso cref="showPerfs"/></summary>
void ShowPerfsEventHandler(object o, EventArgs e);
//snip again
}
and then
Button b;
IEnumerable<IPluginKLol> instancesThatHavePrefsMethods = GetPlugins();
foreach(var i in instancesThatHavePrefsMethods)
{
b = new Button();
b.Click += i.ShowPerfsEventHandler;
this.Children.Add(b);
}
Alternately, you can create a class to translate the event to calling showPerfs (just instantiate, set your reference, and assign the event handler):
public class ShowPerfsBroker
{
public IPluginKLol Victim {get;set;}
public void ShowPerfsEventHandler(object o, EventArgs e)
{
if(Victim == null) return;
Victim.ShowPerfs();
}
}