I have made a simple tic tac toe game and need help tweaking it to fit the bill of object oriented design. Any suggestions most welcome. I basically want it safer, and more "best practice-like" It is a game consisting of four classes, and I'm pretty happy with it as I am new to programming, but maybe it is worthless seen from your perspective. Any pointers, tips and concrete examples would be greatly appreciated!

    Board class:
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Drawing;
    
    namespace TicTac
    {
        class Board
        {
            private int movesMade = 0; //Keeps tracks of how many moves made
    
            private Holder[,] holders = new Holder[3, 3]; //Creates an array of 3x3 
    
            private const int X = 0; //Whatever X presses becomes a 0 in the array
            private const int O = 1; //Whatever O presses becomes a 1 in the array
            public const int B = 2; //Whatever space is unclicked is a 2 in the array
    
            public void initBoard() //Iniates the board
            {
                for (int x = 0; x < 3; x++) //Vertical row
                {
                    for (int y = 0; y < 3; y++) //Horizontal row
                    {
                        holders[x, y] = new Holder();
                        holders[x, y].setValue(B);
                        holders[x, y].setLocation(new Point(x, y));
                    }
                }
            }
            public void detectHit(Point loc) //Checks what space was hit and draws either an O or X depending on whos turn it is
            {
                if (loc.Y <= 500)
                {
                    int x = 0;
                    int y = 0;
    
                    if (loc.X < 167)
                    {
                        x = 0;
                    }
                    else if (loc.X > 167 && loc.X < 334)
                    {
                        x = 1;
                    }
                    else if (loc.X > 334)
                    {
                        x = 2;
                    }
                    if (loc.Y < 167)
                    {
                        y = 0;
                    }
                    else if (loc.Y > 167 && loc.Y < 334)
                    {
                        y = 1;
                    }
                    else if (loc.Y > 334 && loc.Y < 500)
                    {
                        y = 2;
                    }
    
                    movesMade++;
    
                    if (movesMade % 2 == 0) //If even number X turns to act
                    {
    
                        GFX.putX(new Point(x, y));
                        holders[x, y].setValue(X);
                        if (checkWinner(X))
                        {
                            MessageBox.Show("Player 'X' won");
                        }
    
                     }
    
    
                         else
                         {
    
                        GFX.putO(new Point(x, y)); //Calls "Put O" method when its his turn
                        holders[x, y].setValue(O);
                        if (checkWinner(O))
                        {
                            MessageBox.Show("Player 'O' Won!");                        
                        }
    
                    }
                    // MessageBox.Show(x.ToString() + "," + y.ToString());
                }
    
            }
    
            private bool checkWinner(int Z)
            {
                bool winner = false;
    
                for (int x = 0; x < 3; x++)
                {
                    if (holders[x, 0].getValue() == Z && holders[x, 1].getValue() == Z && holders[x, 2].getValue() == Z) //Checks if board is won horizontally
                    {
                        return true;
                    }
                    if (holders[0, x].getValue() == Z && holders[1, x].getValue() == Z && holders[2, x].getValue() == Z) //Checks if board is won vertically
                    {
                        return true;
                    }
                    switch (x)          //Checks if board is won diagnonally
                    {
                        case 0:
                            if (holders[0, 0].getValue() == Z && holders[1, 1].getValue() == Z && holders[2, 2].getValue() == Z) 
                            {
                                return true;
                            }
                            break;
    
                        case 1:
                            if (holders[0, 2].getValue() == Z && holders[1, 1].getValue() == Z && holders[0, 2].getValue() == Z)
                            {
                                return true;
                            }
                            break;                   
                    }
                }
    
                return winner;
            }
        }
    }

Holder class:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace TicTac
    {
       public class Holder
        {
            private Point loc;
            public int value = Board.B;
    
            internal void setLocation(Point p)
            {
                loc = p;
            }
            internal Point getLocation()
            {
                return loc;
            }
    
            internal void setValue(int i)
            {
                value = i;
            }
    
            internal int getValue()
            {
                return value;
            }
        }
    }

Graphics class:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace TicTac
    {
        class GFX
        {
            private static Graphics gObject;
            public GFX(Graphics g)
            {
                gObject = g;
                initBoard();
            }
    
            public void initBoard() //Method that initiates the boaard
            {
                Pen lines = new Pen(Color.Chocolate, 6);
                Brush bg = new SolidBrush(Color.White);
    
                gObject.FillRectangle(bg, new Rectangle(0, 0, 500, 600)); //Draws the background
    
                gObject.DrawLine(lines, new Point(167, 0), new Point(167, 500)); //Draws the lines
                gObject.DrawLine(lines, new Point(334, 0), new Point(334, 500)); //Draws the lines
    
                gObject.DrawLine(lines, new Point(0, 167), new Point(500, 167)); //Draws the lines
                gObject.DrawLine(lines, new Point(0, 334), new Point(500, 334)); //Draws the lines
    
            }
    
            public static void putX(Point loc) //Method that writes out an X
            {
                Pen xObjekt = new Pen(Color.Blue, 4);
                int xAbs = loc.X * 167;
                int yAbs = loc.Y * 167;
    
                gObject.DrawLine(xObjekt, xAbs + 20, yAbs + 20, xAbs + 157, yAbs + 157); //Makes an X when board is clicked, adjusted to not intervene with next square
                gObject.DrawLine(xObjekt, xAbs + 157, yAbs + 20, xAbs + 20, yAbs + 157); //Makes an X when board is clicked, adjusted to not intervene with next square
    
    
            }
            public static void putO(Point loc) //Method that writes out an O
            {
                Pen oObjekt = new Pen(Color.Green, 4);
    
                int xAbs = loc.X * 167;
                int yAbs = loc.Y * 167;
    
                gObject.DrawEllipse(oObjekt, xAbs + 20, yAbs + 20, 120, 120);          //Makes an O when board is clicked, adjusted to not intervene with next square
    
    
            }
        }
    
    }

UI_FORM1:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Drawing;
    
    namespace TicTac
    {
        public partial class Form1 : Form
        {
             Board board;
             GFX engine;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void panel1_Paint(object sender, PaintEventArgs e)
            {
    
            }
    
            private void panel1_Click(object sender, EventArgs e) //When player interacts with the board
            {
                Point mouse = Cursor.Position;
                mouse = panel1.PointToClient(mouse);
                board.detectHit(mouse);
            }
    
            private void gameToolStripMenuItem_Click(object sender, EventArgs e) //When a singleplayermode is selected
            {
                Graphics toPass = panel1.CreateGraphics();
                engine = new GFX(toPass);
    
                board = new Board();
                board.initBoard();
            }
    
        }
    }