Если я понимаю ваш вопрос, вы хотите (максимум) последние 10 отмен и последние 10 повторных команд. После того, как вы получите список команд отмены, используйте это, чтобы получить последние 10:
if (list.Count <= 10)
{
lvUndoStack.Items.AddRange(list.ToArray());
}
else
{
for (int i = 0; i < 10; i++)
{
lvUndoStack.Items.Add(list[0]);
}
}
И сделать то же самое для команд повтора. Это не лучшее решение, IMO - действительно больше препятствий, но оно должно заставить вас двигаться в правильном направлении.
Еще лучшим решением было бы изменение / расширение класса UndoRedoManager, чтобы ListView мог вызывать метод для получения списка последних n команд отмены / повторения. Что-то вроде:
public List<Object> GetUndoCommands(int numberOfCommands);
Тогда ListView может просто вызвать этот метод:
lvUndoStack.Items.AddRange(UndoRedoManager.GetUndoCommands(10).ToArray());
И что-то похожее для команд повтора. Он удаляет кучу кода с вашего уровня пользовательского интерфейса и дает вам возможность легко переключать максимальное количество элементов на более поздний срок, и в целом (опять же IMO), кажется, лучший путь.