Существует ли структура данных «расширяемая 2D-таблица»?
можно не ограничиваться 2D
Как вариант — подсмотреть реализацию ndarray в Numpy. 
Частично описано здесь (на англ.)
Данные хранятся в буфере – типа массива в C. И есть метаданные, описывающие "вид" на этот буфер.
Когда меняется форма, создаётся новый объект метаданных, без изменений в самих данных.
Но тут не раскрывается тема вставки, как это изменяет размер буфера – создают новый или расширяют старый. В конце или распихивают по строкам.
Пока остановился на таком механизме.
Есть два одномерных массива — оглавление строк и оглавление столбцов, два одномерных массива — задействованность строк/столбцов, а также двухмерный массив — буфер.

a[i,j] := buffer[rowIndex[i−i0], colIndex[j−j0]]

Если в rowIndex[i−i0] замечен маркер незадействованности, находим незадействованную строку и прописываем её в оглавлении.
Чтобы меньше перевыделять памяти, перевыделение идёт импульсами и с запасом. Например, хотим 20 строк, а выделяем сразу на 30.
Такой массив способен только расширяться, но этого мне хватает.