As per `man grep`
> The period . matches any single character.
thus `grep .c` match any character followed by `c`
You might be looking for `grep -v \.c` or better `grep -v '\.c$'`
where
* `\.` escape special meaning of .
* `c`
* `$` end of line (when piped to ls output one file name par line)
as suggested by wildcard, you can also use `grep -vF .c` The `-F` flag tells grep to use arg as simple string, not regular expression.