There are several points that possible to improve

If you are working at least with c# 2.0 (as I expect because you mentioned `Nullable<decimal>`), you could replace `ArrayList` with `List<Ingredient>` or even `IEnumerable<Ingredient>`. This will make it more intuitive, and later you could remove type casting from `SumPercentages`

    foreach (Ingredient ig in f.Ingredients)
    {
        SumOfPercentages += ig.Percentage;
    }

Then, if you are working at least with c# 3.0 you could, rewrite `SumPercentages` using LINQ

    public void SumPercentages(Formula f)
    {
        f.SumPercentages = f.Ingredients.Select(ig => ig.Percentage).Sum();
    }

Last point, to implement `ICloneable` for both `Formula` and `Ingredient`. Then replace `this.Ingredients = _Ingredients;` with: `this.Ingredients = Ingredients.Select(ig => ig.Clone()).ToList()` — so `Ingredients` will be copy of initial array. This will prevent situation when you unwittingly change list of ingridients after you have created `Formula`.