The mode cannot be passed as a parameter to a product list block.
See how getMode() function looks like.
public function getMode()
{
return $this->getChild('toolbar')->getCurrentMode();
}
If you go deeper in the getCurrentMode() method of the toolbar block, you will see this
public function getCurrentMode()
{
$mode = $this->_getData('_current_grid_mode');
if ($mode) {
return $mode;
}
$modes = array_keys($this->_availableMode);
$defaultMode = current($modes);
$mode = $this->getRequest()->getParam($this->getModeVarName());
if ($mode) {
if ($mode == $defaultMode) {
Mage::getSingleton('catalog/session')->unsDisplayMode();
} else {
$this->_memorizeParam('display_mode', $mode);
}
} else {
$mode = Mage::getSingleton('catalog/session')->getDisplayMode();
}
if (!$mode || !isset($this->_availableMode[$mode])) {
$mode = $defaultMode;
}
$this->setData('_current_grid_mode', $mode);
return $mode;
}
This means that if there is a 'mode' set on the toolbar block that will be returned. If not then it searches for it in the request, then in session or uses the default mode.
Enough with the explanation, here is how you can solve it.
override the Mage_Catalog_Block_Product_List block and change the getMode method and make it look like this:
public function getMode()
{
if ($this->getData('mode')) {
return $this->getData('mode');
}
return $this->getChild('toolbar')->getCurrentMode();
}
After that your {{block}} directive should work nicely.