Возможна же реализация через смену класса у контейнера с товаром, в зависимости от него у товара будет меняться вид.
Да, разумеется.а в каком-то вообще только название и цена с кнопкой, и чтобы не таскать эту кучу текста возможно и сделана такая реализация. Но есть ли какие-то ещё причины делать все разной версткой?
Еще одна причина - вместительность каждого вида. Если показывать содержимое таблицей (к примеру), ячеек следует подгрузить больше, чем нежели показывая все большими блоками.
Так же, за за причину можно считать то, что существует на этой планете ряд юзеров, отключающих в браузере JavaScript. Для них должен быть нативный способ переключения. А ленивые разработчики, дабы "работало у всех" отказываются от JS-варианта.
Ну а в целом, да - лишние данные являются основной причиной (а также размер загружаемых изображений).