After must discussion internally it appears this 'Might' be possible through the Tooling API
https://ashwanisoni.wordpress.com/2017/01/18/force-com-tooling-api-create-apex-class-apex-trigger-dynamically-and-updatedelete-apex-trigger-apex-class-using-tooling-api-with-rest-api/
Over the next couple of days I will be attempting to implement this solution and will update this answer with my findings.
UPDATE:
So I have implemented a basic script to generate an auradefinationbundle to hold the component. We create this using the method below:
webservice static String createBundle(String sbundleName)
{
JSONGenerator body = JSON.createGenerator(false);
body.writeStartObject();
body.writeStringField('DeveloperName', sBundleName);
body.writeStringField('Description', 'Code Generated Bundle');
body.writeStringField('ApiVersion', '41');
body.writeStringField('MasterLabel', 'Test Label');
body.writeEndObject();
HttpRequest createReq = new HttpRequest();
createReq.setEndpoint(URL.getSalesforceBaseUrl().toExternalForm() + '/services/data/v41.0/tooling/sobjects/AuraDefinitionBundle');
createReq.setBody( body.getAsString() );
System.debug('JSON BODY : ' + body.getAsString());
createReq.setHeader('Authorization', 'Bearer ' + UserInfo.getSessionID());
createReq.setHeader('Content-Type', 'application/json');
createReq.setMethod('POST');
createReq.setTimeout(30000);
Http h = new Http();
HttpResponse createRes = h.send(createReq);
System.debug(createRes.getXmlStreamReader().toString());
String returnId = createRes.getXmlStreamReader().toString().substringAfter('id":"').substringBefore('",');
return returnId;
}
Once created the aura bundle id is returned to be used in any other methods i.e to generate the component mark up like so.
webservice static void createComponent(String sBundleId)
{
JSONGenerator body = JSON.createGenerator(false);
body.writeStartObject();
body.writeStringField('AuraDefinitionBundleId', sBundleId);
body.writeStringField('DefType', 'COMPONENT');
body.writeStringField('Source','<aura:component implements="flexipage:availableForAllPageTypes,force:hasRecordId,force:lightningQuickAction" controller="CampaignUIController">MY COMPONENT</aura:component>');
body.writeEndObject();
HttpRequest createReq = new HttpRequest();
createReq.setEndpoint(URL.getSalesforceBaseUrl().toExternalForm() + '/services/data/v41.0/tooling/sobjects/AuraDefinition');
createReq.setBody( body.getAsString() );
System.debug('JSON BODY : ' + body.getAsString());
createReq.setHeader('Authorization', 'Bearer ' + UserInfo.getSessionID());
createReq.setHeader('Content-Type', 'application/json');
createReq.setMethod('POST');
createReq.setTimeout(30000);
Http h = new Http();
HttpResponse createRes = h.send(createReq);
}
All in all this can be run from the Execute Anonymous window using the follow code.
String bundleId = createAuraDefBundle.createBundle('automaticCreateTest');
createAuraDefBundle.createComponent(bundleId);
Returning the aura bundle:

Hope this helps Guys :)