You can create an observer for this and set page limit dynamic according to your requirement
<event name="catalog_block_product_list_collection">
<observer name="vendor_module_product_list_collection"
instance="vendor\Module\Observer\ListCollectionObserver" />
</event>
And below are the observer file code ListCollectionObserver. You just need to get current category ID and add your product limit in collection
$observer->getCollection()->setPageSize(15);
ListCollectionObserver
<?php
namespace vendor\module\Observer;
use Magento\Customer\Model\Session;
class ListCollectionObserver implements \Magento\Framework\Event\ObserverInterface
{
protected $_storeManager;
public function __construct(
\Magento\Store\Model\StoreManagerInterface $storeManager,
) {
$this->_storeManager = $storeManager;
}
public function execute(\Magento\Framework\Event\Observer $observer)
{
$productCollection = $observer->getCollection();
if(isset($_GET['product_list_limit']) && $_GET['product_list_limit']!='all'){
$productCollection->setPageSize($_GET['product_list_limit'])->load();
}if(isset($_GET['product_list_limit']) && $_GET['product_list_limit']=='all'){
$productCollection->load();
}else{
$productCollection->setPageSize($this->scopeConfig->getValue('catalog/frontend/grid_per_page', \Magento\Store\Model\ScopeInterface::SCOPE_STORE))->load();
}
if(isset($_GET['p'])){
$productCollection->setCurPage($_GET['p'])->load();
}else{
$productCollection->setCurPage(1)->load();
}
}
}