структуру settings.php нельзя делать динамически, потому что всё дерево настроек кэшируется, и кэш меняется только при очистке кэшей или установке обновлений. Но можно сделать одну настройку, например, block_timetable_a/xxx, и для неё сделать свой класс admin_setting_block_timetable_xxx, в котором сделать нужный интерфейс. Единственное, значение поля должно быть упаковано в строку, например, с помощью json_encode.
Но более верный совет тут уже дали, нужно хранить всю структуру в таблицах БД. В настройках при этом можно хранить такие параметры, как максимальное число строк/колонок при редактировании или формат отображения.
Теперь о структуре БД. Мой опыт работы с расписаниями говорит о том, что их может быть много разных, поэтому недостаточно иметь одну таблицу расписаний звонков (они могут отличаться в субботу), общую таблицу преподавателей (их может быть очень много), общую таблицу предметов и т.п. В общем, наивно полагать, что будет только одно расписание, поэтому лучше, чтобы данные каждого блока были привязаны к курсу. Для главной страницы couse_id = 1. Но на одной странице может захотеться разместить несколько блоков, например с основным расписанием, и с расписанием консультаций. Поэтому таблицы звонков, списки предметов и преподавателей лучше вязать в БД к id блока. Соответственно в блоке и должны быть ссылки на страницы настроек звонков, предметов и справочников. Это не должны быть страницы settings.php, нужно делать отдельные страницы в папке блока. Записи в расписании должны вязаться к id блока (чтобы при удалении блока можно было быстро их удалить и к соответствующим преподавателям, урокам, предметам)
Теперь про интерфейс. Расписание всей школы / института достаточно большая таблица, поэтому выводить её всю в html при каждой загрузке страницы, чтобы потом убирать лишнее с помощью js, неправильно. Правильнее выводить только первый или первые два уровня, остальное подгружать с помощью ajax. Если не охота заморачиваться с таким комбо, лучше сделайте всю загрузку через ajax, пусть лучше содержимое блока чуть позже появится, чем с каждой страницей.
Ну и самое главное, вы не смотрели, в moodle совсем нет плагинов для отображения расписания? Может быть лучше взять какую-то отдельную систему, которая будет отображать расписание, и просто сделать html-блок и ссылку на неё?