1) В шаблонах <xsl:template match="shop_item"> и <xsl:template match="shop_item" mode="second"> position() будет возвращать 1
2) Логику выбора "половинок" нужно перенести в <xsl:apply-templates ..>. Например, можно попробовать так:
<xsl:template match="/shop">
...
<xsl:variable name="half" select="ceiling(total div 2)"/>
<section id="goods-list" class="clearer">
<ul>
<xsl:apply-templates select="shop_item[position() <= $half]">
<xsl:sort select="sorting" data-type="number" />
</xsl:apply-templates>
</ul>
<ul>
<xsl:apply-templates select="shop_item[position() > $half]">
<xsl:sort select="sorting" data-type="number" />
</xsl:apply-templates>
</ul>
</section>
</xsl:template>
<xsl:template match="shop_item">
<li><a href="{url}" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="shop_item">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</a></li>
</xsl:template>
3) сразу не заметил: сортировка по полю sorting будет в уже отобранных коллекциях элементов, поэтому лучше переписать через <xsl:for-each>
<xsl:template match="/shop">
...
<xsl:variable name="half" select="ceiling(total div 2)"/>
<section id="goods-list" class="clearer">
<ul>
<xsl:for-each select="shop_item">
<xsl:sort select="sorting" data-type="number" />
<xsl:if test="position() <= $half">
<xsl:apply-templates select="."/>
</xsl:if>
</xsl:for-each>
</ul>
<ul>
<xsl:for-each select="shop_item">
<xsl:sort select="sorting" data-type="number" />
<xsl:if test="position() > $half">
<xsl:apply-templates select="."/>
</xsl:if>
</xsl:for-each>
</ul>
</section>
</xsl:template>
<xsl:template match="shop_item">
<li><a href="{url}" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="shop_item">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</a></li>
</xsl:template>
4) существенным недостатком в п.3 является проход по всем элементам переданным в xml, поэтому лучше перевести сортировку в контроллер показа и использовать решение из п.2 (с убранной сортировкой)