Large message population design
public IEnumerable&lt;object&gt; Build(Project project, IServiceBusResolver serviceBusResolver, TIncoming incomingMessage)
{        
    TOutgoing outgoingMessage = BuildOutgoingMessage(project, serviceBusResolver, incomingMessage);

    return outgoingMessage != null ? new[] { outgoingMessage } : null;
}



Why should this return an IEnumerable&lt;T&gt; ? This just doesn't make sense at all. BuildOutgoingMessage() is only building one object. 

The BuildOutgoingMessage() method doesn't use the serviceBusResolver parameter. If this is because it is only for overriding in a derived class, you should consider to add some documentation for this case.  

The MessageBuilder class states that it implements IMessageBuilder&lt;TIncoming&gt; but it doesn't implement its method.