Boa noite!
Acho que seja porque no construtor da classe Lista ele já define a variável _proximaPosicao com o valor 0. Então quando a classe Lista é instanciada em um objeto, ele sempre começa a _proximaPosicao com 0 e conforme as adições e remoções acontecem no processamento do código, ele altera esse valor para assim controlar a próxima posição.
public Lista(int capacidadeInicial = 5)
{
_itens = new T[capacidadeInicial];
_proximaPosicao = 0;
}
Depois ele interage com a variável nos métodos Adicionar e Remover.
public void Adicionar(T item) {
VerificarCapacidade(_proximaPosicao + 1);
// Console.WriteLine($"Adicionando item na posição {_proximaPosicao}");
_itens[_proximaPosicao] = item;
_proximaPosicao++;
}
public void Remover(T item)
{
int indiceItem = -1;
for (int i = 0; i < _proximaPosicao; i++)
{
T itemAtual = _itens[i];
if (itemAtual.Equals(item))
{
indiceItem = i;
break;
}
}
for (int i = indiceItem; i < _proximaPosicao - 1; i++)
{
_itens[i] = _itens[i + 1];
}
_proximaPosicao--;
}