Selecione os elementos que você não quer, em vez de tentar remover os elementos que você não quer. Isso é muito mais fácil (e geralmente mais eficiente também) do que remover elementos.
var newSequence = (from el in list
where el.Something || el.AnotherThing < 0
select el);
Eu queria postar isso como um comentário em resposta ao comentário deixado por Michael Dillon abaixo, mas é muito longo e provavelmente útil para ter em minha resposta de qualquer maneira:
Pessoalmente, eu nunca removeria itens um por um, se você precisar removê-los, em seguida, chamar RemoveAllque leva um predicado e reorganiza a matriz interna apenas uma vez, enquanto Removefaz uma Array.Copyoperação para cada elemento que você remove. RemoveAllé muito mais eficiente.
E quando você está repetindo a iteração sobre uma lista, você já possui o índice do elemento que deseja remover, portanto seria muito mais eficiente chamar RemoveAt, porque Removeprimeiro é percorrida a lista para encontrar o índice do elemento que você deseja remover. está tentando remover, mas você já conhece esse índice.
Então, apesar de tudo, não vejo motivo para chamar Removeum loop for. E, idealmente, se for possível, use o código acima para transmitir elementos da lista conforme necessário, para que nenhuma segunda estrutura de dados tenha que ser criada.