Based on your comments, let me see if I can address this.
Picklists on page layouts.
These are static values. Yes, there are dependent picklists. Picklists can also be filtered by record type. But there is no hook to dynamically populate a picklist on the user interface using Apex code, unless you use Visualforce.
Triggers
Triggers are invoked on save, delete, and undelete. In order for a trigger to do what you want ("I have a custom picklist field in my Task object that I'm trying to populate by a trigger.") it would somehow have to fire when the UI is rendered. This is not what Triggers do.
Dynamic Picklists and Visualforce
The only way to dynamically populate a picklist in the Salesforce UI with data is in a Visualforce page where the Apex code in the custom controller or extension performs the query and populates the picklist. It isn't possible otherwise.
So what are your options?
...you must be asking at this point.
Well, looking at your code and reading into it a bit, this would be a great opportunity for a lookup relationship. Typically this is the option you use when the related data is coming from another object. Unfortunately you are working with Task. And Task does not support custom fields that are lookups (or any relationship, for that matter).
In reality, the only option I can see is Visualforce.
But...maybe you should take a step back. You described a coding problem. It might be useful to understand what the business problem is that needs to be solved. Often people new to the platform (reading into things here) attempt a solution in code when there is another solution already out there. I'd suggest another post detailing that business problem, how you've tried to solve it, and what hasn't worked. Who knows...there might be something else out there.
You'll need to do this in javascript.
I'm a bit unsure when you want to do the component creation, I'm guessing at init, so in your c.init function, you'll have
var fieldName = cmp.get("v.fieldName");
$A.createComponent("ui:inputDate", { "value": cmp.getReference("v.case." + fieldName) }, function callback(newCmp) { cmp.set("v.body", newCmp); });
You can see using cmp.getReference() is what creates the link you would normally get by using {!v.case.Reason} in the cmp file.
Best Answer
Add the following in the Apex class:
Add the following to the lightning controller: