I've looked around for this and there seem to be a couple of different ways on how to do this.
However, all of these seem to be old ways (I might be completely wrong here and those methods can be totally valid today) but I'd like to make sure I'm using the latest method for doing this and avoid making a request like it's suggested in one of the StackExchange answers in the link above (The tooling API method). I also don't want to implement this in a Visual Force or any UI pages, I'd like to create custom fields on an existing object based on a received post request.
A simple example for what I'm trying to do:
for (String fieldName : fieldNameList)
{
Existing_Custom_Object__c.CreateNewCustomField(name = fieldName, type = checkbox, ...);
// Upload/Push this change to the org
}