Ah, the tags aren't being closed in the source, thank you. However, they're still closed by the browser even though I'm loading closing tags at the end of the transformation. Here's the rest of the transformation:
<!-- Creates the very first row -->
<%# DataItemIndex == 0 ? "<div class=\"row\">" : "" %>
<div class="content"><!--Begin of item-->
<%# Eval("Some_Value1")%>
<%# Eval("Some_Value2")%>
<%# Eval("Some_Value3")%>
</div><!--End of item-->
<!-- End last row and create a new row -->
<%# (DataItemIndex + 1) % 3 == 1 ? "</div><div class=\"row\">" : "" %>
Basically, I'm making rows for a grid of items and starting a new row if the item's index is divisible by 3 (so rows of 3).
I've solved the issue by switching to a text/XML transformation (which I think is faster than ASCX anyway), but I'm still not sure why the tags would be auto-closed for ASCX and not Text/XML.