Use an ObservableCollection
as the container for the items you want to display in the ListBox. This will automatically trigger a refresh of the control when items are added or removed.
Since you now never need create a new collection (only refresh its contents), you can use a regular C# property for this.
Personally, I would abstract this out
private ObservableCollection<MyItem> _mylist = new ObservableCollection<MyItem>();
public IEnumerable<MyItem> MyList => _mylist;
To refresh the list ...
_myList.Clear();
_mylist.Add( ... );
The control will still update, as it detects that MyList implements INotifyCollectionChanged, even though it is just declared as IEnumerable.
You should never use a DependencyProperty for the source of data binding - a regular property, combined with INotifyPropertyChanged is the preferred way for any properties that update their value. Take a look at the MVVM pattern as a way of separating the user interface from the remainder of the code.