Having a class return a single database instance or list of all database instances I'd like the following to happen:

var person = new Person(); // Create instance of new person with Id 0
var person1 = new Person(1); // Creates instance of existing person from database
var list = new Person().List(); // Creates instance of all persons from database


I'm sure there's a better way than what I'm currently doing:

using System.Collections.Generic;
using System.Data;

public class Person
{
    public int Id { get; set; }

    public string Name { get; set; }

    public int GenderId { get; set; }

    public Person()
        : this(0)
    {
    }

    public Person(int id)
    {
        if (id == 0)
        {
            Id = id;
        }
        else
        {
            LoadFromDataBase(id);
        }
    }

    public List&lt;Person&gt; List()
    {
        return LoadFromDataBase(0);
    }

    private List&lt;Person&gt; LoadFromDataBase(int personId)
    {
        var dt = new DataTable();
        // Assume Data acquired from database using personId.
        // A Value of 0 returns all rows

        var list = new List&lt;Person&gt;();

        foreach (DataRow dr in dt.Rows)
        {
            var person = new Person();
            Id = person.Id = (int)dr["Id"];
            Name = person.Name = (string)dr["Name"];
            GenderId = person.GenderId = (int)dr["GenderId"];

            list.Add(person);
        }

        return list;
    }
}
First, I don't like the concept of mixing "Models" with "Repository". 

One principle that, from my point of view, should be followed, is the Single Responsibility (the S in SOLID). It means that one class should have one responsibility, and only one. Therefore yours would be against this principle, simply because you are holding your data, and loading data from the database.

If you want to follow this Principle, you would have one class "PersonRepository", that handles getting/updating data to the database, and a second class "Person", which is the person itself. 

PersonRepository personRepository = new PersonRepository();
Person person = personRepository.Find(1); // Would return a person
List&lt;Person&gt; persons = personRepository.FindAll(); // Would return all records


Anyway, regarding your implementation, the point that are bad :


Constructors --> Never do any database related/IO operation in constructor. How would you handle the exception ? You would have an object created (as you cannot destruct them), but actually a "not working" object. Bad practice. And as said by Nick, it will not be clear for the user of the class that this load the user from database. Imagine he wants to create a Person with a predefined ID, he may think using the "ID" for the constructor would be the way to go
As said before, Load and List should be static.
Why is the "LoadFromDatabase" id mandatory ? Use optional parameters, in example :

... LoadFromDataBase(int personId = 0);

Same for the constructor
Imagine now you have a webpage/grid in an application that should display some filtered value, or paginated. How would you handle this ? You would create tons of method within your person class to "LoadFromDatabaseFilterByName(String name)", "LoadFromDatabasePage(2)",... And this would mess up with real method of the class (see first paragraph.
As said by Nick, the LoadFromDataBase is really... strange.