O token Regex dentro da classe de caractere para negação é ^ , não ! .
Então você precisa:
ls | grep '^[^0-9]'
Se você usar ls | grep ^[!0-9] , então, em [] , ! será tratado literalmente e 0-9 será expandido da maneira usual.
Também para esse tipo de tarefa trivial, use shell globbing, o Regex é um pouco demais para isso, e também não analisa ls ; você poderia simplesmente fazer:
ls [^[:digit:]]*
ls [![:digit:]]*
Observe que bash suporta ^ e ! como token de negação de padrão dentro da classe de caracteres durante a globulação.
Se você não quer depender de você, locale :
ls [^[0-9]]*
ls [![0-9]]*