There's a divisibleby tag.
So you can do something (ugly) like:
{% for field in form %}
| {{ field }} |
{% if forloop.last %}
{% else %}
{% if forloop.counter|divisibleby:"3" %}
{% endif %}
{% endif %}
{% endfor %}
Alternatively, you could give your form class a table_print method that returns a html string (wrapped in mark_safe).