Ошибка была не очевидная, но таки понятная

Связана она с самоуничтожением объекта.
Когда Вы нажимаете на динамически созданную кнопку, срабатывает метод
ListButtonClick, который в свою очередь вызывает
ShowList. Ну а в
ShowList Вы удаляете все ранее созданные динамические объекты и создаете их по новой. По завершению метода
ShowList программа возвращается в
ListButtonClick и когда завершается он, то происходит внутреннее обращение к вызвавшему этот метод объекту. А он уже уничтожен. Вот Вам и ошибка доступа к памяти.
Почему она происходила не всегда? Да потому, что под массив
Form2.Components[] память выделена и только перераспределяется по необходимости при добавлении или удалении элементов, а адресация при этом сохраняется. Если Вы удаляете элемент из середины списка, то ошибки не будет, т.к. весь массив элементов сдвигается на место удаленных и ссылка на объект не NULL. А когда удаляете последний, то его место уже никто не занимает и ссылка - NULL. Привет ошибка доступа к памяти.
Код для удаления объектом самого себя можно найти в интернете. Вариантов для этого уйма. Удачи!