Hi Andrew
Here's a reworked version of your code:
\define body()
<$list filter="[is[current]fields[]sort[]] -draft.of -draft.title -show-field -text -title -modified $(showfield)$" variable="listItem">
<tr class="tc-view-field">
<td class="tc-view-field-name">''<<listItem>>'':</td>
<td class="tc-view-field-value"><$transclude field=<<listItem>>/></td>
</tr>
</$list>
\end
<$list filter="[all[current]has[show-field]]">
<table class="tc-view-field-table">
<tbody>
<$set name="showfield" value={{!!show-field}}>
<<body>>
</$set>
</tbody>
</table>
</$list>
The major changes were:
* Moving the body of the table into a macro so that the $()$ syntax works - textual substitutions only occur when macros are parsed
* Using the "has" filter operator to detect presence of a field
* Removing the double quotes around the "value" attribute of the set widget; they cause their content to be treated as a literal string, so that the {{}} syntax isn't parsed as a transclusion
* Using line-breaks to make the code a bit easier to read
Best wishes
Jeremy.