Out of the two options, event receiver is the best approach. Deploy your event receiver with a web-scoped feature and handle ListAdded
event:
Event Receiver:
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Receivers >
<Receiver>
<Name>EventReceiverListAdded</Name>
<Type>ListAdded</Type>
<Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
<Class>Class.EventReceiverListAdded</Class>
<SequenceNumber>10000</SequenceNumber>
</Receiver>
</Receivers>
</Elements>
List Added:
public override void ListAdded(SPListEventProperties properties)
{
base.ListAdded(properties);
SPWeb propertiesWeb = properties.Web as SPWeb;
SPSite propertiesSite = propertiesWeb.Site;
using (SPSite site = new SPSite(propertiesSite.ID))
{
using (SPWeb web = site.OpenWeb(propertiesWeb.ID))
{
var list = propertiesWeb.Lists[properties.List.ID];
list.Fields.Add("Your Column", SPFieldType.Text, true)
list.Update();
}
}
}
Just a note: I always tend to open a new web or site objects and get lists/items as they might be changed by other event receivers. This way the solution is more scalable if you don't use properties.List/Web/Site/ListItem.