Você está certo sobre o fim da linha sendo importante; Ambos os sistemas operacionais esperam que a linha termine com "\ n", mas o Windows também adiciona um "\ r" antes que o unix não espera, então os programas unix irão gerar o "\ r" de sua própria maneira.
O arquivo não termina com os dois caracteres "^" e "M", que é apenas uma maneira comum de representar caracteres não imprimíveis. Programas produzirão "^" e uma letra correspondente ao valor do byte, começando com A para 1. M é a 13ª letra e '\ r' é o código ASCII 13 (ou 0xD, como você disse), então você verá "^ M "