Я бы предоставил общую библиотеку, на которую ссылаются и ваш код, и библиотеки плагинов (назовите это зависимостью Контракта). Там определите интерфейс для типа узла, например, INodeType. Также рассмотрите возможность реализации там AbstractNodeType, который реализует INodeType и предоставляет некоторые полезные свойства, которые автор плагина может установить в своем конструкторе.
Одним из свойств INodeType является свойство ContextMenu, которое возвращает контекстное меню форм Windows.
В вашем коде укажите недвижимость:
[Import("NodeTypes", typeof(INodeType))]
public IEnumerable<INodeType> extensionNodeTypes { get; set; }
Вы можете просто перечислить это после того, как написали.
В коде плагина они объявили бы новые типы узлов примерно так (может не скомпилироваться):
[Export("NodeTypes", typeof(INodeType))]
public class SomeNodeType : AbstractNodeType
{
public SomeNodeType()
{
this.ContextMenu = base.BuildContextMenu(/* ... */);
/* etc. */
}
/* ... other custom logic ... */
}
Надеюсь, я не ошибся в синтаксисе, но это общая идея.