damarkuzz, смотря, как выводишь, скорее всего чистоганом, поэтому помочь может nth-child. Ну или цикличный селектор.
Край, если совсем скучно, можно попробовать вложенные списки и на них завязать привязку цикличную. Это так, для фана, не более.
Если же речь о выводе на JS, то можно на нем и расчеты проводить. Ну или на бэке и в соответствии с этим генерить стили. На JS в принципе самое оптимальное, т.к. позволяет задавать такую вложенность процедурных стилей, сколько надо в данные момент.
Norum, от флексов надо отказаться, это само-собой. Флексы не панацея.
Shape-outside применяется к объекту, который будет обтекаться.
А про вариант с гридами можешь забыть, то, что я держал в голове без танцев с бубном не реализуемо. Остается только сбросить и играться на медиазапросах, как с блочным элементом, внутри которого строчные.
Артур Левенсон, ты можешь использовать grid со свойством dense. Или выровнять их внутри с помощью фактического контейнера, или контейнера с нужным соотношением (процентный отстсуп) и т.д.