Вывод и обновление данных в ListView WPF

        <ListView x:Name="listView1">
            <ListView.View>
                <GridView>
                    <GridView.Columns>
                        <GridViewColumn Header="Animal" DisplayMemberBinding="{Binding Name}" />
                        <GridViewColumn Width="90" DisplayMemberBinding="{Binding Id}">
                            <Label Width="90" Background="Aqua" HorizontalContentAlignment="Left">
                                ID
                            </Label>
                        </GridViewColumn>
                        <GridViewColumn Header="Counter" Width="60" DisplayMemberBinding="{Binding Counter}" />
                    </GridView.Columns>
                </GridView>
            </ListView.View>
        </ListView>

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            listView1.Items.Add(new Animal("Козёл", 0, (s, n) =>
            {
                Application.Current.Dispatcher.Invoke(() =>
                {
                    Animal? animal = s as Animal;
                    System.Diagnostics.Debug.WriteLine($"{animal?.Name}: {n}");
                    listView1.Items.Refresh();
                });
            }));
            listView1.Items.Add(new Animal("Жираф", 1, null));
            listView1.Items.Add(new Animal("Бегемот", 2, null));
        }
    }
    public class Animal
    {
        public string Name { get; }
        public int Id { get; }
        public int Counter { get; private set; } = 0;

        public Animal(string name, int id, Action<object, int>? progress)
        {
            Name = name;
            Id = id;

            Task.Run(() =>
            {
                Random r = new Random();
                int delay = r.Next(500, 1000);
                while (true)
                {
                    Counter++;
                    progress?.Invoke(this, Counter);
                    Thread.Sleep(delay);
                }
            });
        }

Как обновить только тот элемент, от которого пришло событие?
Как написать произвольный текст в произвольной ячейке? Например, не просто 150, а 150 GB? То есть, исходя от значения поля класса, вывести какой-то текст, а не само это значение.