Eu consegui uma boa solução com este:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- This is the line -->
<item android:top="-1dp" android:right="-1dp" android:left="-1dp">
<shape>
<solid android:color="@android:color/transparent" />
<stroke android:width="1dp" android:color="#ffffff" />
</shape>
</item>
</layer-list>
Isso funciona bem no caso de você precisar de um fundo transparente, mas ainda de uma cor de traço aberta (no meu caso, eu só precisava de uma linha de fundo). Se precisar de uma cor de fundo, você pode adicionar uma cor de forma sólida como na resposta de Maragues.
EDITAR 1
Às vezes, para dispositivos de alta densidade, o uso de valores de mergulho baixos pode resultar em cursos ou distâncias muito finas ou invisíveis. Isso pode acontecer com você também ao definir os divisores ListView.
A solução mais simples é usar uma distância de 1px em vez de 1dp. Isso tornará a linha sempre visível em todas as densidades. A melhor solução seria criar recursos de dimensão para cada densidade, para obter o melhor tamanho para cada dispositivo.
Editar 2
Divertido, mas tentei usar 6 anos depois e não consigo obter um bom resultado nos dispositivos Lollipop.
Provavelmente, a solução atual é usar 9 patches. O Android deveria ter criado uma solução fácil para esse problema depois de todo esse tempo.