Добавь отображение истории которая хранится в history_board на страницу приложения History.
Вот код который у меня есть
1 файл:


<ContentPage.Content>



</ContentPage.Content>

2 файл:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace TicTac
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class History : ContentPage
{
public History()
{
Title = "История игр";
InitializeGameField();
}
private void InitializeGameField()
{
var viewModel = BindingContext as ViewM;
if (viewModel != null)
{
}
}
}
}

3 файл:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Text;
using System.Windows.Input;
using Xamarin.Forms;

namespace TicTac
{
public class ViewM : INotifyPropertyChanged
{
internal Game _game;
public byte fieldSize { get; set; } = 3;


    public ICommand MinusSize { get; }
    public ICommand PlusSize { get; }
    public ICommand StartGame { get; }
    public ICommand MoveCommand { get; }


    public ViewM()
    {
        _game = new Game(fieldSize);

        MinusSize = new Command(DecreaseFieldSize);
        PlusSize = new Command(IncreaseFieldSize);
        StartGame = new Command(StartNewGame);
        MoveCommand = new Command<int>(Move);
    }
    public char[] board => _game.board; //получение доски из игры
    public string Xwin => _game.Xwin.ToString();
    public string Owin => _game.Owin.ToString();

    private void Move(int index)
    {
        if (_game.Move((byte)index))
        {
            OnPropertyChanged(nameof(board)); //обнновление доски
            OnPropertyChanged(nameof(Turn)); //обновление чей ход
            OnPropertyChanged(nameof(Xwin));
            OnPropertyChanged(nameof(Owin));
        }
    }

    public string Turn
    {
        get
        {
            return !_game.isWin ? (_game.Xturn ? "Ход: X" : "Ход: O") : (_game.Xturn ? "Победил X" : "Победил O"); //так как в логике игры переменная хода является булевой
        }
    }

    private void DecreaseFieldSize()
    {
        fieldSize--;
        OnPropertyChanged(nameof(fieldSize));
    }

    private void IncreaseFieldSize()
    {
        fieldSize++;
        OnPropertyChanged(nameof(fieldSize));
    }

    private void StartNewGame()
    {
        _game.Restart(fieldSize);
        OnPropertyChanged(nameof(Turn));

    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
}

4 файл:

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
using System.Xml;

namespace TicTac
{
internal class Game// : INotifyPropertyChanged
{
public char[] board;
public char[][] history = { };
public ArrayList history_board = new ArrayList();
public bool Xturn = true;
private byte size;
public bool isWin = false;
public int Xwin = 0;
public int Owin = 0;


    public Game(byte fieldSize) {
        Restart(fieldSize);
    }
    public void Restart(byte fieldSize)
    {
        size = fieldSize;
        Xturn = true;
        isWin = false;
        board = new char[fieldSize * fieldSize];
        for (int i = 0; i < (fieldSize * fieldSize); i++)
        {
            board[i] = ' '; //заполнение поля пустотой
        }
    }

    public bool Move(byte cell) { //ход
        if (board[cell] == ' ' && !isWin) //проверка клетки на свободность
        {
            board[cell] = Xturn ? 'X' : 'O'; //занятие ячейки в зависимости от того чей ход
            Xturn = !Xturn;
            if (WinCheck())
            {
                isWin = true;
                Xturn = !Xturn;
                if (Xturn) { Xwin++; } else { Owin++; };
                history_board.Add(board);
            };
            return true;
        }
        else { return false; }
    }

    public bool WinCheck() {
        var lineRef = new char[size];
        var line = new char[size];
        for (int i = 0; i < size; i++)
        {
            lineRef[i] = !Xturn ? 'X' : 'O';
        }
        for (int row = 0; row < size; row++) //проверка строк
        {
            line = new char[size];
            for (int col = 0; col < size; col++)
            {
                line[col] = board[row * size + col];
                if (line.SequenceEqual(lineRef))
                {
                    return true;
                }
            }
        }
        for (int col = 0; col < size; col++) //проверка столбцов
        {
            line = new char[size];
            for (int row = 0; row < size; row++)
            {
                line[row] = board[row * size + col];
                if (line.SequenceEqual(lineRef))
                {
                    return true;
                }
            }
        }
        for (int i = 0; i < size; i++) //проверка \ диагонали
        {
            line[i] = board[i * (size + 1)];
            if (line.SequenceEqual(lineRef))
            {
                return true;
            }
        }
        for (int i = 0; i < size; i++) //проверка / диагонали
        {
            line[i] = board[(i+1)*(size-1)];
            if (line.SequenceEqual(lineRef))
            {
                return true;
            }
        }
        return false;

    }

    //public event PropertyChangedEventHandler PropertyChanged;
    //private void OnPropertyChanged([CallerMemberName] string propertyName = "")
    //{
    //    if (PropertyChanged != null)
    //    {
    //        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    //    }
    //}
}
}

5 файл:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace TicTac
{
public partial class MainPage : ContentPage
{
public MainPage()
{
Title = "TicTacToe";
InitializeComponent();
InitializeGameField();
}


    private void InitializeGameField()
    {
        var viewModel = BindingContext as ViewM;
        if (viewModel != null)
        {
            field.Children.Clear();
            field.RowDefinitions.Clear();
            field.ColumnDefinitions.Clear();

            for (int row = 0; row < viewModel.fieldSize; row++)
            {
                for (int col = 0; col < viewModel.fieldSize; col++)
                {
                    var button = new Button();
                    int index = row * viewModel.fieldSize + col; //расёт индекса элемента так как используется одномерное поле
                    button.SetBinding(Button.TextProperty, new Binding($"board[{index}]")); //привязка текста кнопок к элементам поля
                    button.Command = viewModel.MoveCommand;
                    button.CommandParameter = index;

                    field.Children.Add(button, col, row);
                }
            }
        }
    }

    private void ReDraw(object sender, EventArgs e) //перерисовка поля после начала игры
    {
        InitializeGameField();
    }
    private async void ToHistory(object sender, EventArgs e) {
        await Navigation.PushAsync(new History());
    }

}
}

6 файл:


<ContentPage.BindingContext>
    <vm:ViewM/>
</ContentPage.BindingContext>

<AbsoluteLayout>
    <Frame BackgroundColor="#2196F3" Padding="12" CornerRadius="0"
           AbsoluteLayout.LayoutBounds="0, 0, 1, 0.14"
           AbsoluteLayout.LayoutFlags="All"
           >
        <Button Text="История игр" FontSize="36"
            AbsoluteLayout.LayoutFlags="All"
            Clicked="ToHistory"/>
    </Frame>
    <Grid HorizontalOptions="Center"
          AbsoluteLayout.LayoutBounds="0.5, 0.15"
          AbsoluteLayout.LayoutFlags="PositionProportional">
        <Label Text="X:" FontSize="36" Grid.Column="0" HorizontalTextAlignment="Center"/>
        <Label Text="{Binding Xwin}" FontSize="36" Grid.Column="1" HorizontalTextAlignment="Center"/>
        <Label Text="O:" FontSize="36" Grid.Column="3" HorizontalTextAlignment="Center"/>
        <Label Text="{Binding Owin}" FontSize="36" Grid.Column="4" HorizontalTextAlignment="Center"/>

    </Grid>
    <Grid HorizontalOptions="Center"
          AbsoluteLayout.LayoutBounds="0.5, 0.23"
          AbsoluteLayout.LayoutFlags="PositionProportional">
        <!--<Label Text="Turn:" FontSize="36" Grid.Column="0" HorizontalTextAlignment="Center"/>-->
        <Label Text="{Binding Turn}" FontSize="36" Grid.Column="0" HorizontalTextAlignment="Center"/>
    </Grid>

    <Grid x:Name="field"
          AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 0.4"
          AbsoluteLayout.LayoutFlags="All">
    </Grid>

    <Grid AbsoluteLayout.LayoutBounds="0.5, 0.9, 1, 0.1"
          AbsoluteLayout.LayoutFlags="All">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="2*" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="2*" />
        </Grid.ColumnDefinitions>
        <Button Text="-" Grid.Column="0"
                Command="{Binding MinusSize}"/>
        <Label Text="{Binding fieldSize}" FontSize="42" Grid.Column="1" HorizontalTextAlignment="Center" VerticalTextAlignment="Center"/>
        <Button Text="+" Grid.Column="2"
                Command="{Binding PlusSize}"/>
    </Grid>
    <Button Text="New game" FontSize="36"
            AbsoluteLayout.LayoutBounds="0.5, 1, 1, 0.1"
            AbsoluteLayout.LayoutFlags="All"
            Command="{Binding StartGame}"
            Clicked="ReDraw"/>
</AbsoluteLayout>