la cuestion es que un datagrid tiene la propiedad AutogenerateColumns y con ello cuando haces el bind genera las columnas, filas necesarias y por eso la exportación se hace bien.
En el caso de un datalist lo tienes que hacer a mano, puedes crear una tabla con los datos necesarios para que cuando hagas la exportación puedas ver las diferencias..
Ejemplo:
Cita: <asp:datalist id="DataList1" runat="server">
<HeaderTemplate>
<table border="0">
</HeaderTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
<ItemTemplate>
<tr>
<td>
<asp:Label Runat=server ID="lbl1" text='<%# Container.DataItem("Campo1") %>'>
</asp:Label>
</td>
<td>
<asp:Label Runat=server ID="Label1" text='<%# Container.DataItem("Campo2") %>'>
</asp:Label>
</td>
<td>
<asp:Label Runat=server ID="Label2" text='<%# Container.DataItem("Campo3") %>'>
</asp:Label>
</td>
</tr>
</ItemTemplate>
</asp:datalist>
Espero te sirva..
Salu2