Klient nie wie, że jest to plik CSV (w końcu to tylko tekst!).
Spróbuj dodać to PRZED wszelkimi danymi wyjściowymi (na górze skryptu):
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
Zasadniczo mówisz klientowi/przeglądarce, że dane, które wyślesz w pliku CSV.
To powinno działać.
Więcej informacji o nagłówkach znajdziesz tam:http://php.net/manual/ pl/funkcja.header.php