I was able to get more than 2 columns working. It's not quite where I want it to be yet (each column had only one cell, so "rows" don't line up).
Pertinent code follows:
select="//udt:Context/udt:ModuleId" />_param</xsl:variable>
<xsl:template match="udt:Data" mode="list">
<xsl:call-template name="cell">
</xsl:call-template>
</xsl:template>
<xsl:template name="cell">
<xsl:call-template name="EditLink" />
<xsl:value-of select="udt:Wallpaper" disable-output-escaping="yes" />
<br />
<b>
<xsl:value-of select="udt:Title" />
</b>
<br />
<xsl:value-of select="udt:Caption" />
<br />
<input type="checkbox" />
<br />
<br />
</xsl:template>
<xsl:template match="/udt:UserDefinedTable">
<xsl:variable name="currentData" select="udt:Data" />
<table border="0" class="Normal">
<tr valign="top">
<td align="center">
<xsl:apply-templates select="$currentData[(position() - 1) mod 3 = 0]" mode="list">
</xsl:apply-templates>
</td>
<td align="center">
<xsl:apply-templates select="$currentData[(position() - 2) mod 3 = 0]" mode="list">
</xsl:apply-templates>
</td>
<td align="center">
<xsl:apply-templates select="$currentData[(position()) mod 3 = 0]" mode="list">
</xsl:apply-templates>
</td>
</tr>
</table>
</xsl:template>
<xsl:template name="EditLink">