Olá Pedriana,
você deve estar se confundindo em algum ponto: o ArrayList não é um componente gráfico. Ele é uma classe, assim como a String, por exemplo. O ArrayList implementa algumas funções de um array, como inserção, remoção e aumento de capacidade.
Dito isso, o modo de acesso a um elemento de um ArrayList é idêntico ao de um array:
meuArrayList[indice]
Assim, o código de um InsertionSort será o mesmo que é utilizado para um array normal.
No seu caso, existe uma outra coisa a ser pensada: como comparar dois Produtos. Isso pode ser feito criando um novo método
bool MenorQue(Produto outroProduto)
na sua classe Produto. Ele deve implementar a lógica que você quer utilizar para saber se um produto é menor que o outro, por exemplo:
return this.preco < outroProduto.preco || this.cod < outroProduto.cod
Assim, ao invés de fazer uma condição direta usando o operador < como:
produtos[analise].getPreco() < produtos[analise -1].getPreco()
você poderia chamar algo como:
produtos[analise].Menorque(produtos[analise -1])