На самом деле не работает ни один из вариантов.
Просто ваша директива получает в качестве контроллера функцию mailListCtrl, которую вы и объявили в 3 варианте.
Оберните название контроллера в кавычки:
mailApp.directive('mailList', function(){
    return {
        restrict: 'E',
        templateUrl: 'mailListDirective.html',
        controller: 'mailListCtrl',
        // replace: true,
        controllerAs: 'mailListCtrl'
    };
});
Еще лучше, если вы начнете использовать 
компоненты, появившиеся в Angular 1.5+ 
А вот 
стартовый шаблон, использующий вебпак для сборки и синтаксис ES6, так выглядит современное приложение на Angular 1.