List class/controller to prevent memory exhaustion
Is the class itself thread safe

Looks fairly safe except TasksController Controller part.

Firstly, I would suggest to use .NET classes for storing concurent data instead of List&lt;T&gt; depending on your needs you can use ConcurrentBag&lt;T&gt;, ConcurrentQueue&lt;T&gt;. 
Secondly, create lock for TasksController Controller and use it inside getter. Something like this: 

private static TasksController Controller {
    get{
        lock(_controllerLock){ 
           if(_controller == null){ (_controller = new TasksController();} 
           return _controller
        }
    }}


Is deriving from IDisposable necessary

I would say: no. All tasks should be disposed automatically when they finish.

However, there is only one but, you might to cancell your tasks when object is being disposed. That means if they do some heavy calculations which you do not need anymore after main object disposes. See this answer for information how to do that. 

For more information about disposing tasks see MSDN blog post