А что вам мешает написать
ProductDTO[] вместо создания отдельного DTO? Это тоже будет работать, а ещё лучше врубите
transform: true в конфигурации валидации в вашем приложении, чтобы наверняка, так сказать.
Если у вас в приложении не включена валидация, то советую сделать это глобально в файле
app.ts
Читать только если вы новичёк в NestВы же не пишете отдельные ValidationPipe для каждого Create эндпоинта?
app.useGlobalPipes(new ValidationPipe({ transform: true }));
Потом легко вытаскиваем это в контроллере
@Body() productsDto: ProductDto[]