Option 1: turn back now and find and tweak a ready made solution, there are tons of GUI libraries for every language and framework.
Option 2: roll your own for the sake of rolling your own. Continue reading!
If you intend to have anything more complex than a health/score display, you will want to do it in multiple "layers".
Start with the bottom layer - the lowest level. Create some classes and routines that draw the various graphic elements (drawButton(X, Y, text, state)). Create the next layer - GUI elements themselves, which then use your drawing functions to draw themselves appropriately. Let these both have a common ancestor - a Control class which then handles things like passing mouse clicks through to its child Controls or firing actions when clicked. Create your Window class that also derives from Control, but has its own extra functionality like dragging and closing, if you need windows in your GUI.
Finally create the top layer, the Window/GUI manager. This will then take mouse and key input, keep track of what's in focus and what's where, draw windows in the right order, all the things, so that in the end you will perhaps end up with 2-3 methods that are actively used on game runtime, not counting initialisation and death.
By layering your abstraction like this you can make changes easily exactly where you need them - I made the mistake of having it all flat before and gave up after realising that now that I want buttons to highlight when mouse over I had to change like 30 places which each defined its own button.
As usual I will drop the most recent version of what I have, most of it is readily reusable but it is not really finished and probably MonoGame specific. The higher leve stuff, however, gives you a good idea of the layered principles:
Here, I have two lower levels, one that deals with creating all the appropriate geometry that's later handed to the graphics card, and one that requests the creation of said geometry to actually render graphical elements.